/**
 * 
 */
package cc.dogtailflower.framework.handler;

import java.lang.annotation.Annotation;
import java.util.HashSet;
import java.util.Set;

import cc.dogtailflower.framework.annotation.Controller;
import cc.dogtailflower.framework.annotation.Entity;
import cc.dogtailflower.framework.util.ClassUtil;

/**
 * 类操作处理类
 * @author cc
 *
 */
public class ClassHandler {

	/*
	 * 存放所有指定目录下加载的类
	 */
	private static final Set<Class<?>> CLASS_SET;
	
	//类加载的时候初始化该集合，通过调用ClassUtil加载
	static{
		CLASS_SET = ClassUtil.getClassSet(ConfigHandler.getBasePackage());
	}
	/*
	 * get方法
	 */
	public static Set<Class<?>> getClassSet() {
		return CLASS_SET;
	}
	
	//提供几个筛选的方法
	/*
	 * 从已经加载的所有类中筛选
	 * 获取指定父类的所有子类或者实现类（不包括自己）
	 */
	public static Set<Class<?>> getClassSetBySuper(Class<?> superClass){
		Set<Class<?>> classSet = new HashSet<Class<?>>();
		for(Class<?> cls : CLASS_SET){
			if(superClass.isAssignableFrom(cls) && !superClass.equals(cls)){
				classSet.add(cls);
			}
		}
		return classSet;
	}
	
	/*
	 * 入参为注解class
	 * 获取带有指定注解的类
	 */
	public static Set<Class<?>> getClassSetByAnnotation(Class<? extends Annotation> annotationClass){
		Set<Class<?>> classSet = new HashSet<Class<?>>();
		for(Class<?> cls : CLASS_SET){
			if(cls.isAnnotationPresent(annotationClass)){
				classSet.add(cls);
			}
		}
		return classSet;
	}
	
	/*
	 * 获取所有 Controller 类
	 */
	public static Set<Class<?>> getControllerClassSet(){
		return getClassSetByAnnotation(Controller.class);
	}
	
	/*
	 * 获取所有的 Entity 类
	 */
	public static Set<Class<?>> getEntityClassSet(){
		return getClassSetByAnnotation(Entity.class);
	}
}
